import os
import re
import chardet


def process_files_in_folders(en_folder_path, zh_cn_folder_path):
    """
    处理en文件夹和zh-cn文件夹下对应的文件，将zh-cn文件夹文件内容追加到en文件夹对应文件（不存在对应内容时），并保存结果（覆盖源文件）
    """
    en_files = [f for f in os.listdir(en_folder_path) if os.path.isfile(os.path.join(en_folder_path, f))]
    for file in en_files:
        en_file_path = os.path.join(en_folder_path, file)
        zh_cn_file_path = os.path.join(zh_cn_folder_path, file)
        if os.path.isfile(zh_cn_file_path):
            process_single_file_pair(en_file_path, zh_cn_file_path)


def process_single_file_pair(en_file_path, zh_cn_file_path):
    """
    处理一对en文件和zh-cn文件，提取数组数据，将zh-cn文件中不存在于en文件的内容追加进去，覆盖保存en文件
    """
    # 使用chardet库尝试自动检测编码读取en文件内容
    en_content = read_file_content(en_file_path)
    if en_content is None:
        return

    # 使用chardet库尝试自动检测编码读取zh-cn文件内容
    zh_cn_content = read_file_content(zh_cn_file_path)
    if zh_cn_content is None:
        return

    # 提取en文件中字典形式的数据（优化正则表达式以更好处理格式问题，并去除注释）
    en_match = re.search(r'return \[\s*(.*?)\s*\];', en_content, re.DOTALL)
    if en_match:
        en_data_str = en_match.group(1).strip()
        # 去除可能存在的单行注释（以//开头的注释）
        en_data_str = re.sub(r'//.*', '', en_data_str)
        en_original_dict = {}
        en_pairs = re.findall(r"('.*?')\s*=>\s*('.*?')", en_data_str)
        for pair in en_pairs:
            en_key = pair[0].strip("'")
            en_value = pair[1].strip("'")
            en_original_dict[en_key] = en_value

        # 提取zh-cn文件中字典形式的数据（同样处理格式和注释）
        zh_cn_match = re.search(r'return \[\s*(.*?)\s*\];', zh_cn_content, re.DOTALL)
        if zh_cn_match:
            zh_cn_data_str = zh_cn_match.group(1).strip()
            zh_cn_data_str = re.sub(r'//.*', '', zh_cn_data_str)
            zh_cn_original_dict = {}
            zh_cn_pairs = re.findall(r"('.*?')\s*=>\s*('.*?')", zh_cn_data_str)
            for pair in zh_cn_pairs:
                zh_cn_key = pair[0].strip("'")
                zh_cn_value = pair[1].strip("'")
                zh_cn_original_dict[zh_cn_key] = zh_cn_value

            # 将zh-cn文件中不存在于en文件的内容追加到en文件对应字典
            updated_en_dict = en_original_dict.copy()
            for zh_cn_key, zh_cn_value in zh_cn_original_dict.items():
                if zh_cn_key not in updated_en_dict:
                    updated_en_dict[zh_cn_key] = zh_cn_value

            # 构建新的en文件内容，严格遵循原文件格式规范进行拼接（这里假设原文件数组元素间换行且缩进格式，可按需调整）
            new_en_array_elements = [f"'{new_key}' => '{new_value}'" for new_key, new_value in updated_en_dict.items()]
            new_en_array_str = ",\n    ".join(new_en_array_elements)
            new_en_content = en_content[:en_match.start()] + "return [\n    " + new_en_array_str + "\n];\n" + en_content[en_match.end():]

            # 覆盖源文件保存结果，添加异常处理确保写入完整
            try:
                with open(en_file_path, 'w', encoding='utf-8') as outfile:
                    outfile.write(new_en_content)
            except Exception as e:
                print(f"写入en文件 {en_file_path} 时出现异常: {e}")
        else:
            print(f"在zh-cn文件 {zh_cn_file_path} 中未找到合适的数组数据定义")
    else:
        print(f"在en文件 {en_file_path} 中未找到合适的数组数据定义")


def read_file_content(file_path):
    """
    使用chardet库自动检测文件编码并读取文件内容
    """
    with open(file_path, 'rb') as infile:
        raw_data = infile.read()
    result = chardet.detect(raw_data)
    encoding = result['encoding']
    try:
        content = raw_data.decode(encoding)
        return content
    except UnicodeDecodeError:
        print(f"使用 {encoding} 编码读取文件 {file_path} 失败，请手动检查文件编码格式")
        return None


if __name__ == "__main__":
    en_folder = input("请输入en文件夹的路径: ")
    zh_cn_folder = input("请输入zh-cn文件夹的路径: ")
    process_files_in_folders(en_folder, zh_cn_folder)
    print("处理完成，已覆盖en文件夹下的源文件保存结果。")